package com.expert.miniapp.controller;

import com.expert.miniapp.dto.AddCaseFromRecommendationRequest;
import com.expert.miniapp.dto.CaseDTO;
import com.expert.miniapp.dto.ResultDTO;
import com.expert.miniapp.service.CaseService;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * CaseController - 案例控制器
 * 提供案例的GET展示接口
 *
 * @author System
 * @since 2025-10-19
 */
@RestController
@RequestMapping("/api/cases")
@CrossOrigin(origins = "*")
public class CaseController {

    private static final Logger logger = LoggerFactory.getLogger(CaseController.class);

    @Autowired
    private CaseService caseService;

    /**
     * 获取案例列表（支持分页）
     *
     * @param pageNum  页码，默认为1
     * @param pageSize 每页记录数，默认为10
     * @return 统一响应结构，包含分页信息和案例列表
     */
    @GetMapping(produces = "application/json;charset=UTF-8")
    public ResultDTO<PageInfo<CaseDTO>> getCaseList(
            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
            @RequestParam(value = "pageSize", defaultValue = "10") int pageSize
    ) {
        logger.info("接收到获取案例列表请求: pageNum={}, pageSize={}", pageNum, pageSize);

        try {
            // 参数校验
            if (pageNum < 1) {
                logger.warn("页码参数invalid: pageNum={}", pageNum);
                return ResultDTO.error("页码必须大于0");
            }

            if (pageSize < 1 || pageSize > 100) {
                logger.warn("每页记录数参数invalid: pageSize={}", pageSize);
                return ResultDTO.error("每页记录数必须在1-100之间");
            }

            // 查询案例列表
            PageInfo<CaseDTO> pageInfo = caseService.getCaseList(pageNum, pageSize);

            logger.info("案例列表查询成功，共 {} 条记录", pageInfo.getTotal());

            return ResultDTO.success(pageInfo);

        } catch (Exception e) {
            logger.error("获取案例列表失败", e);
            return ResultDTO.error("获取案例列表失败：" + e.getMessage());
        }
    }

    /**
     * 获取案例详情
     *
     * @param caseId 案例ID
     * @return 统一响应结构，包含案例详情
     */
    @GetMapping(value = "/{caseId}", produces = "application/json;charset=UTF-8")
    public ResultDTO<CaseDTO> getCaseDetail(@PathVariable String caseId) {
        logger.info("接收到获取案例详情请求: caseId={}", caseId);

        try {
            // 参数校验
            if (caseId == null || caseId.trim().isEmpty()) {
                logger.warn("案例ID参数为空");
                return ResultDTO.error("案例ID不能为空");
            }

            // 查询案例详情
            CaseDTO caseDTO = caseService.getCaseDetail(caseId);

            if (caseDTO == null) {
                logger.warn("案例不存在: caseId={}", caseId);
                return ResultDTO.error("案例不存在");
            }

            logger.info("案例详情查询成功: caseId={}", caseId);

            return ResultDTO.success(caseDTO);

        } catch (Exception e) {
            logger.error("获取案例详情失败: caseId={}", caseId, e);
            return ResultDTO.error("获取案例详情失败：" + e.getMessage());
        }
    }

    /**
     * 从推荐项添加案例
     *
     * @param request 请求体，包含itemId
     * @return 统一响应结构，包含新创建的案例详情
     */
    @PostMapping(value = "/add-from-recommendation", produces = "application/json;charset=UTF-8")
    public ResultDTO<CaseDTO> addCaseFromRecommendation(@RequestBody AddCaseFromRecommendationRequest request) {
        logger.info("接收到添加案例请求: itemId={}", request.getItemId());

        try {
            // 参数校验
            if (request.getItemId() == null || request.getItemId().trim().isEmpty()) {
                logger.warn("推荐项ID参数为空");
                return ResultDTO.error("推荐项ID不能为空");
            }

            // 调用服务层添加案例
            CaseDTO caseDTO = caseService.addCaseFromRecommendation(request.getItemId());

            logger.info("案例添加成功: caseId={}, num={}, itemId={}",
                    caseDTO.getCaseId(), caseDTO.getNum(), request.getItemId());

            return ResultDTO.success(caseDTO);

        } catch (IllegalArgumentException e) {
            logger.warn("参数错误: {}", e.getMessage());
            return ResultDTO.error(e.getMessage());

        } catch (RuntimeException e) {
            logger.warn("业务异常: {}", e.getMessage());
            return ResultDTO.error(e.getMessage());

        } catch (Exception e) {
            logger.error("添加案例失败: itemId={}", request.getItemId(), e);
            return ResultDTO.error("添加案例失败：" + e.getMessage());
        }
    }
}
